Appearance
SpringBoot为什么默认使用CGLIB
SpringBoot默认使用CGLIB 原因如下:
- 无需接口: CGLIB能够代理那些没有实现接口的类,而JDK动态代理只能代理实现了接口的类。这使得Spring Boot可以更灵活地使用代理,而无需依赖于接口。
- AOP支持: Spring Boot广泛使用AOP(面向切面编程)来处理日志、事务、安全性等横切关注点。CGLIB更适合创建AOP代理,因为它可以代理普通的类而不仅仅是接口,在开发中如果通过反射获得代理目标方法的注解,如果用JDK动态代理将导致无法获取。
- 可以代理本类方法:这意味着即使在同一个类中调用了另一个方法,仍然可以触发代理的行为。这对于某些特定的AOP需求非常有用,因为它允许您在同一类中的方法之间应用切面。这种能力被称为"自我调用"或"内部调用"的代理。
- 方法调用性能: 一旦代理对象创建完成,实际的方法调用性能可能会因代理方式而异。在JDK 1.8之后,JDK动态代理的方法调用性能相对较好,但CGLIB仍然可能更快,因为CGlib是直接调用父类方法即目标方法,无需像JDK代理还要通过反射进行内部方法栈调用才能到目标方法。
更新: 2023-09-26 14:06:05
原文: https://www.yuque.com/tulingzhouyu/db22bv/big13fgmk149wb5l
短视频
今天分享一个 SpringBoot中非常有趣的核心问题:为什么 Spring Boot默认使用cglib作为代理实现方式?
其实在Spring Boot中,默认使用CGLIB作为代理实现方式背后有着深刻的原因。
首先,CGLIB 不受限于接口,因为它能够生成子类作为代理对象,这意味着无论是接口还是实现类都可以被代理,这种灵活性为开发者提供了更多的选择空间。
其次呢,CGLIB 利用底层的字节码技术来创建动态代理对象,相比于JDK动态代理,它能够绕过反射调用,提高了性能,特别是在大规模对象代理和频繁调用的情况下,性能优势更为显著。
除此之外,CGLIB 还提供了很多的选项来控制代理行为,这对于复杂的代理场景来说尤为重要,我们可以更精细地调整代理对象的行为以满足特定需求。
最后给大家总结一下 ,Spring Boot选择CGLIB作为默认代理实现方式,既因为其灵活性和性能优势,也因为其提供的更多选项来控制代理行为,但在实际项目中,选择代理方式仍应根据具体需求来做出合适的决定。
更新: 2024-05-15 15:58:29
原文: https://www.yuque.com/tulingzhouyu/db22bv/fgbce9xhs0op86vx